﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;


namespace GestorDeFlotas.Core
{

public class Reloj
    {
        public int codigoReloj { get; set; }
        public int marcaCodigo { get; set; }
        public string marca { get; set; }
        public string modelo { get; set; }
        public DateTime fechaDeVerificacion { get; set; }
        public string numeroDeSerie { get; set; }
        public bool esActivo { get; set; }

        public Reloj() { }

        public Reloj(int codigoReloj) {
            this.codigoReloj = codigoReloj;
                
        }

        public Reloj Cargar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = string.Format("SELECT r.reloj_codigo,r.reloj_marca_codigo,m.marca_nombre,r.reloj_modelo,r.reloj_fecha_verificacion,r.reloj_nro_serie"+
                                           " FROM CRAZY_TAXI.TL_Relojes r, CRAZY_TAXI.TL_Marcas_Relojes m" +
                                           " WHERE r.reloj_marca_codigo = m.marca_codigo " +
                                           " AND r.reloj_codigo ={0}", this.codigoReloj);
                   
                SqlCommand getCliente = SqlUtils.GetNewCommand(sql);
                getCliente.Connection = connection;
                getCliente.Connection.Open();
                SqlDataReader reader = getCliente.ExecuteReader();

                if (reader.HasRows)
                {
                    reader.Read();

                    this.marca = reader.GetString(2);
                    this.marcaCodigo = Convert.ToInt32(reader.GetInt32(1));
                    this.modelo = reader.GetString(3);
                    this.numeroDeSerie = reader.GetString(5);
                    this.fechaDeVerificacion = Convert.ToDateTime(reader.GetDateTime(4));                   
                }
                else
                {
                    throw new Exception(string.Format("No existe un Reloj con código {0}.", this.codigoReloj));
                }

                reader.Close();
                return this;
            }
        }



        public void Crear()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();

                string sql = "INSERT INTO CRAZY_TAXI.TL_Relojes (reloj_marca_codigo, reloj_modelo,reloj_fecha_verificacion,reloj_nro_serie,reloj_es_activo)" +
                             "VALUES (@marcaCodigo, @modelo, @fechaDeVerificacion, @numeroDeSerie, @esActivo)";
                SqlCommand crearReloj = SqlUtils.GetNewCommand(sql);

                SetearParametros(crearReloj);

                crearReloj.Connection = connection;
                crearReloj.ExecuteNonQuery();
            }


        }
        private void SetearParametros(SqlCommand sql)
        {
            SqlParameter paramModelo = new SqlParameter("@modelo", SqlDbType.VarChar);
            paramModelo.IsNullable = false;
            paramModelo.Value = this.modelo;

            SqlParameter paramMarcaCodigo = new SqlParameter("@marcaCodigo", SqlDbType.Int);
            paramMarcaCodigo.IsNullable = false;
            paramMarcaCodigo.Value = this.marcaCodigo;

            SqlParameter paramNumeroDeSerie = new SqlParameter("@numeroDeSerie", SqlDbType.VarChar);
            paramNumeroDeSerie.IsNullable = true;
            paramNumeroDeSerie.Value = this.numeroDeSerie;

            SqlParameter paramFechaDeVerificacion = new SqlParameter("@fechaDeVerificacion", SqlDbType.DateTime);
            paramFechaDeVerificacion.IsNullable = false;
            paramFechaDeVerificacion.Value = this.fechaDeVerificacion;

            SqlParameter paramActivo = new SqlParameter("@esActivo", SqlDbType.Bit);
            paramActivo.IsNullable = false;
            paramActivo.Value = 1;

            sql.Parameters.Add(paramMarcaCodigo);
            sql.Parameters.Add(paramModelo);
            sql.Parameters.Add(paramFechaDeVerificacion);
            sql.Parameters.Add(paramNumeroDeSerie);
            sql.Parameters.Add(paramActivo);            
        }

        public void Modificar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction();

                try
                {
                    ModificarDatosCliente(connection, transaction);
                    transaction.Commit();
                }
                catch (Exception e)
                {
                    e.ToString();
                    transaction.Rollback();
                    throw;
                }
            }
        }

        private void ModificarDatosCliente(SqlConnection connection, SqlTransaction transaction)
        {
            string sql = "UPDATE CRAZY_TAXI.TL_Relojes SET  [reloj_marca_codigo] = @reloj_marca_codigo, [reloj_modelo] = @reloj_modelo,[reloj_fecha_verificacion] = @reloj_fecha_verificacion,[reloj_nro_serie] = @reloj_nro_serie, [reloj_es_activo]=@reloj_es_activo"
                + " WHERE [reloj_codigo] = @reloj_codigo";
            SqlCommand modificarCliente = SqlUtils.GetNewCommand(sql);

            SqlParameter paramRelojMarcaCodigo = new SqlParameter("@reloj_marca_codigo", SqlDbType.Int);
            paramRelojMarcaCodigo.IsNullable = false;
            paramRelojMarcaCodigo.Value = this.marcaCodigo;

            SqlParameter paramRelojModelo = new SqlParameter("@reloj_modelo", SqlDbType.VarChar);
            paramRelojModelo.IsNullable = false;
            paramRelojModelo.Value = this.modelo;

            SqlParameter paramFechaVerificacion = new SqlParameter("@reloj_fecha_verificacion", SqlDbType.DateTime);
            paramFechaVerificacion.IsNullable = true;
            paramFechaVerificacion.Value = this.fechaDeVerificacion;

            SqlParameter paramRelojNroSerie = new SqlParameter("@reloj_nro_serie", SqlDbType.VarChar);
            paramRelojNroSerie.IsNullable = false;
            paramRelojNroSerie.Value = this.numeroDeSerie;

            SqlParameter paramRelojCodigo = new SqlParameter("@reloj_codigo", SqlDbType.Int);
            paramRelojCodigo.IsNullable = false;
            paramRelojCodigo.Value = this.codigoReloj;

            SqlParameter paramRelojEsActivo = new SqlParameter("@reloj_es_activo", SqlDbType.Bit);
            paramRelojEsActivo.IsNullable = false;
            paramRelojEsActivo.Value = this.esActivo;
            
           
            modificarCliente.Parameters.Add(paramRelojMarcaCodigo);
            modificarCliente.Parameters.Add(paramRelojModelo);
            modificarCliente.Parameters.Add(paramFechaVerificacion);
            modificarCliente.Parameters.Add(paramRelojNroSerie);
            modificarCliente.Parameters.Add(paramRelojCodigo);
            modificarCliente.Parameters.Add(paramRelojEsActivo);
            modificarCliente.Connection = connection;
            modificarCliente.Transaction = transaction;
            modificarCliente.ExecuteNonQuery();
        }

        public void SetInactivo()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = "UPDATE CRAZY_TAXI.TL_Relojes SET reloj_es_activo = 0 WHERE reloj_codigo = @reloj_codigo";

                // Codigo para borrar el rol de la base
                SqlCommand updateRecord = SqlUtils.GetNewCommand(sql);

                SqlParameter rowParameter = new SqlParameter("@reloj_codigo", SqlDbType.Int);
                rowParameter.IsNullable = false;
                rowParameter.Value = this.codigoReloj;

                updateRecord.Parameters.Add(rowParameter);
                updateRecord.Connection = connection;
                updateRecord.Connection.Open();
                updateRecord.ExecuteNonQuery();
            }
        }
        
    }
}
